#include <iostream>
#include <cstring>
#include "ShareMemory.hpp"
#include "Fifo.hpp"
#include "Time.hpp"

int main()
{
    shm.CreatShm();
    shm.AttachShm();

    shm.ShmMeta();
    std::cout << "time: " << GetCurTime() << std::endl;
    std::cout << "pid: " << getpid() << std::endl;

    // 1.数据不一致: 刚写完一个字符, 立刻就读走了
    // char* strinfo = (char*)shm.GetAddr();
    // std::cout << "server addr: " << (void*)strinfo << std::endl;
    // while(true)
    // {
    //     sleep(1);
    //     std::cout << strinfo << std::endl;
    // }

    // 2.添加两个命名管道, 模拟进程间同步, 保证数据一致性
    fifoA.OpenFifoForRead();
    fifoB.OpenFifoForWrite();
    struct data *data = (struct data *)shm.GetAddr();
    while (true)
    {
        fifoA.FifoRead(); // 当命名管道正常 && 写端为空时: 读端阻塞

        std::cout << "status: " << data->status << std::endl;
        std::cout << "lasttime: " << data->lasttime << std::endl;
        std::cout << "image: " << data->image << std::endl;

        fifoB.FifoWrite();
    }

    shm.DetachShm();
    shm.DeleteShm();

    return 0;
}

// int main()
// {
//     // 1.创建key
//     key_t k = ::ftok(gpath.c_str(), gprojId);
//     if (k < 0)
//     {
//         std::cerr << "ftok error" << std::endl;
//         return 1;
//     }
//     std::cout << "key: " << ToHex(k) << std::endl;

//     // 2.创建共享内存 && 获取
//     // 注意: 共享内存也有权限
//     int shmid = ::shmget(k, gshmsize, IPC_CREAT | IPC_EXCL | gmode);
//     if (shmid < 0)
//     {
//         std::cerr << "shmget error" << std::endl;
//         return 2;
//     }
//     std::cout << "shmid: " << shmid << std::endl;

//     // 3.将共享内存挂接到进程的虚拟地址空间
//     void *addr = ::shmat(shmid, nullptr, 0);
//     std::cout << "attach shm done" << std::endl;
//     std::cout << "shm addr: " << addr << std::endl;

//     // 4.在这里进行通信...

//     // 5.将共享内存与进程的虚拟地址空间去关联
//     ::shmdt(addr);
//     std::cout << "detach shm done" << std::endl;

//     // 6.删除共享内存
//     ::shmctl(shmid, IPC_RMID, nullptr);
//     std::cout << "delete shm done" << std::endl;

//     return 0;
// }